iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
AI/ ML & Data

基於人工智慧與深度學習對斑馬魚做行為分析系列 第 11

day 11 yolo 辨識養殖豬隻系統

  • 分享至 

  • xImage
  •  

今天是第11天我們可以寫一個yolo 辨識系統來模擬養隻已減少人工養豬的人力,以下是程式碼

import cv2
import numpy as np
import torch
from pathlib import Path

# 載入 YOLO 模型
model = torch.hub.load('ultralytics/yolov8', 'yolov8s')  # 選擇模型版本,例如yolov8s, yolov8m等

def detect_pigs(image_path):
    # 讀取圖片
    img = cv2.imread(image_path)
    
    # 使用 YOLO 模型進行推論
    results = model(img)

    # 取得檢測結果
    labels, coords = results.xyxyn[0][:, -1], results.xyxyn[0][:, :-1]

    # 設定豬隻類別 ID(假設為 0,需依據實際模型類別設定)
    pig_class_id = 0

    for i, (label, coord) in enumerate(zip(labels, coords)):
        if label == pig_class_id:
            x1, y1, x2, y2, conf = coord
            if conf > 0.5:  # 只考慮置信度高於 50% 的檢測
                start_point = (int(x1 * img.shape[1]), int(y1 * img.shape[0]))
                end_point = (int(x2 * img.shape[1]), int(y2 * img.shape[0]))
                img = cv2.rectangle(img, start_point, end_point, (255, 0, 0), 2)
                img = cv2.putText(img, f'Pig {conf:.2f}', start_point, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

    # 儲存或顯示結果
    output_path = "output_" + Path(image_path).name
    cv2.imwrite(output_path, img)
    print(f"檢測結果已儲存至 {output_path}")

# 呼叫 detect_pigs 函數進行檢測
detect_pigs('path_to_your_pig_image.jpg')
import cv2
import numpy as np
import torch
from pathlib import Path

這段代碼導入了所需的 Python 庫:

  • cv2:OpenCV 庫,用於圖像處理。
  • numpy:用於處理數組(此範例中未使用,但通常和 OpenCV 一起使用)。
  • torch:PyTorch 庫,用於加載和運行 YOLO 模型。
  • Path:用於處理路徑名稱的庫。
# 載入 YOLO 模型
model = torch.hub.load('ultralytics/yolov8', 'yolov8s')  # 選擇模型版本,例如yolov8s, yolov8m等

這行代碼透過 torch.hub.load 方法從 ultralytics 的 YOLOv8 模型庫中加載 yolov8s 模型。yolov8s 是 YOLOv8 的一個版本(其中 s 代表 small),你可以根據需求選擇不同大小的模型,例如 yolov8m(medium)、yolov8l(large)等。

def detect_pigs(image_path):
    # 讀取圖片
    img = cv2.imread(image_path)

detect_pigs 是一個函數,用於在指定圖片中偵測豬隻。這裡使用 OpenCV (cv2.imread) 加載圖片。

    # 使用 YOLO 模型進行推論
    results = model(img)

這行代碼使用先前加載的 YOLO 模型來對圖片進行推論(也就是進行物件偵測)。results 變數將保存 YOLO 模型對圖片中物件的檢測結果。

    # 取得檢測結果
    labels, coords = results.xyxyn[0][:, -1], results.xyxyn[0][:, :-1]

這行代碼從 results 中提取檢測結果:

  • labels:檢測到的物件的類別標籤。
  • coords:檢測到的物件的坐標和置信度。

results.xyxyn 是 YOLO 模型返回的數據結構,包含了每個檢測到的物件的邊界框坐標 (x1, y1, x2, y2) 和置信度 (confidence)。

    # 設定豬隻類別 ID(假設為 0,需依據實際模型類別設定)
    pig_class_id = 0

這行定義了豬隻的類別 ID,假設在這個 YOLO 模型中豬隻的類別 ID 為 0。實際的類別 ID 需要根據使用的模型來確定。

    for i, (label, coord) in enumerate(zip(labels, coords)):
        if label == pig_class_id:
            x1, y1, x2, y2, conf = coord
            if conf > 0.5:  # 只考慮置信度高於 50% 的檢測
                start_point = (int(x1 * img.shape[1]), int(y1 * img.shape[0]))
                end_point = (int(x2 * img.shape[1]), int(y2 * img.shape[0]))
                img = cv2.rectangle(img, start_point, end_point, (255, 0, 0), 2)
                img = cv2.putText(img, f'Pig {conf:.2f}', start_point, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

這段代碼遍歷所有檢測結果:

  • 如果 label 等於 pig_class_id,表示檢測到的物件是豬隻。
  • 然後,提取邊界框的四個坐標 (x1, y1, x2, y2) 和置信度 (conf)。
  • 如果置信度大於 0.5(50%),則使用 cv2.rectangle 在圖片上繪製矩形框來標示豬隻的位置,並使用 cv2.putText 在矩形框旁顯示 "Pig" 和置信度。
    # 儲存或顯示結果
    output_path = "output_" + Path(image_path).name
    cv2.imwrite(output_path, img)
    print(f"檢測結果已儲存至 {output_path}")

這段代碼將處理過的圖片儲存為新文件,並將文件名稱設定為原圖片名稱前加上 output_。最後,打印一條消息,告知結果已儲存的位置。

# 呼叫 detect_pigs 函數進行檢測
detect_pigs('path_to_your_pig_image.jpg')

這行代碼呼叫 detect_pigs 函數,並將圖片路徑作為參數傳遞進去。替換 'path_to_your_pig_image.jpg' 為實際的豬隻圖片路徑,系統就會對該圖片進行檢測並儲存結果。

這個程式是一個使用 YOLOv8 進行豬隻偵測。


上一篇
day 10 Lstm model training
下一篇
day 12 lstm yolo 使用者視窗
系列文
基於人工智慧與深度學習對斑馬魚做行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言